///////////////////////////////////////
////     ANALIZADOR SINTÁCTICO     ////
///////////////////////////////////////

parser grammar Anasint;

options {
  tokenVocab = Analex;
}

@header {
  package practpl.cincomod;
}

/*Principal*/
flex:(
		   primera_seccion {System.out.println("Reconocida Primera Seccion");}
		   SEPARADOR
		   segunda_seccion {System.out.println("Reconocida Segunda Seccion");}
		   SEPARADOR 
		   tercera_seccion {System.out.println("Reconocida Tercera Seccion");}
		   EOF
   ) ;


//Sección de declaraciones
primera_seccion: (definicion definicion) (definicion_codigo_C) ;

definicion: (NOMBRE corchetes);
corchetes: (CORCHETEA (RANGO|NOMBRE|NUMERO)? CORCHETEC);
definicion_codigo_C: (ABRE_SCC  (INT NOMBRE PUNTOCOMA STRING2 NOMBRE PUNTOCOMA) CIERRA_SCC);
tipodato: (INT | SHORT | LONG | DOUBLE | CHAR | VOID);

//Sección de Reglas 
segunda_seccion: (patron accion patron accion) ;

patron: (PATRON (PATRON_MULT)?);
accion: (NOMBRE (INCREMENTO|DECREMENTO) PUNTOCOMA);


//Sección de código
tercera_seccion: (funcion1 funcion2);

funcion1: INT NOMBRE PARENTESISA VOID PARENTESISC LLAVEA retorno LLAVEC;
funcion2: INT NOMBRE PARENTESISA INT NOMBRE COMA CHAR ASTERISCO NOMBRE corchetes PARENTESISC LLAVEA linea1 linea2 linea2 linea6 linea3 linea4 linea5 linea5 retorno LLAVEC ;
//linea: ((NOMBRE IGUAL NUMERO) | ((NOMBRE IGUAL)? NOMBRE PARENTESISA (argumentos)?));
linea1: (NOMBRE IGUAL NOMBRE PARENTESISA NOMBRE corchetes COMA STRING PARENTESISC PUNTOCOMA);
linea2: (NOMBRE IGUAL NUMERO PUNTOCOMA);
linea3: NOMBRE PARENTESISA PARENTESISC PUNTOCOMA;
linea4: NOMBRE PARENTESISA NOMBRE PARENTESISC PUNTOCOMA;
linea5: NOMBRE PARENTESISA STRING COMA NOMBRE PARENTESISC PUNTOCOMA;
linea6: NOMBRE PUNTOCOMA;
retorno: RETURN NUMERO PUNTOCOMA;
//argumentos: (VOID | ((COMA)? (STRING | ((tipodato (ASTERISCO)?)? NOMBRE (corchetes)? )))*) PARENTESISC;
